from Tkinter import * 
import tkMessageBox
from vista.Menu import Menu
from vista import TAMANIO
from time import sleep, time
from modelo.batalla_naval import *

class Grilla():
	def __init__(self, barcos, cliente):
		self.cliente = cliente
		self.x = "x"
		self.y = "y"
		self.lista = "barcos"
		self.tablero = self.cliente.tablero
		self.menu = Menu()
		self.orientacion = 'v'
		def nocallback(event):
			pass

		def callback(event):
			self.frame.focus_set()
			texto = event.widget.__getitem__("text")
			celda = Posicion(int(texto[0]), int(texto[2]))
			barco = self.barcos[self.barco]
			try:
				self.tablero.agregar(barco, celda, self.orientacion)
			except:
				self.menu.popup("Error", "No se puede colocar un barco aqui")
			else:
				self.redibujarGrilla()
				self.barco += 1
			if self.barco < len(self.barcos):
				self.etiqueta["text"] = dibujarBarco()
			else:
				self.barco -= 1
				self.redibujarGrilla()
				self.siguiente.destroy()
				self.root.destroy()

		def key(event):
			self.frame.focus_set()
			caracter = str(event.char)
			if caracter in ['V', 'v']:
				self.orientacion = 'v'
			if caracter in ['H', 'h']:
				self.orientacion = 'h'
			self.etiqueta["text"] = dibujarBarco()

		def dibujarBarco():
			barco = self.barcos[self.barco]
			cadena = "Precione 'h' o 'v' para cambiar la orientacion\n"
			cadena += barco.nombre + ':\n'
			for i in range(barco.largo):
				cadena += 'O'
				if self.orientacion == 'v':
					cadena += '\n'
			return cadena

		self.barco = 0
		self.barcos = barcos
		self.root = Tk(); self.root.title("Tu Tablero")
		self.frame = Frame(self.root, bg = "black", width = 500, height = 500)
		self.frame.bind("<Key>", key)
		self.frame.pack()
		self.frame.focus_set()
		self.grilla = []
		for i in range(TAMANIO):
			self.grilla.append([])
			for j in range(TAMANIO):
				cad = str(i)+"-"+str(j)
				b = Button(self.frame, text = cad, bg="blue")
				b.grid(row=i, column=j)
				b.bind("<Button-1>", callback)
				self.grilla[i].append(b)

		self.siguiente = Toplevel(); self.siguiente.title("Siguiente barco")
		self.next = Frame(self.siguiente, bg = "black", width = 50, height = 50)
		self.next.pack()
		self.next.bind("<Key>", key)
		self.etiqueta = Label(self.next)
		self.etiqueta["text"] = dibujarBarco()
		self.etiqueta.pack()
		self.root.mainloop()

	def redibujarGrilla(self):
		for i in self.barcos[self.barco].listar_posiciones():
			x, y = getattr(i, self.x), getattr(i, self.y)
			self.grilla[x][y]["bg"] = "green"

	def setearGetters(self):
		t = Tablero(TAMANIO, TAMANIO)
		p = Posicion(3,8)
		for s in p.__dict__:
			if p.__dict__[s] == 3:
				self.x = s
			if p.__dict__[s] == 8:
				self.y = s
		a = Barco("Hola", 3)
		b = Barco("Chau", 2)
		t.agregar(b, (1,1), "v")
		t.agregar(a, (4,4), "v")
		for s in t.__dict__:
			if isinstance(t.__dict__[s], list):
				if len(t.__dict__[s] == 2):
					if len(t.__dict__[s][0].listar_posiciones()) == 3:
						self.lista = s
	
	def update(self):
		for i in range(3):
			sleep(0.001)
			self.cliente.Loop()

	def actualizarEnemigo(self, tupla, valor):
		dic = {"hundido":"red", "tocado":"green", "agua":"blue"} 
		self.grillaEnemiga[int(tupla[0])][int(tupla[1])]["bg"] = dic[valor]
		
	def actualizarMio(self, tupla, valor):
		dic = {"hundido":"black", "tocado":"red", "agua":"darkblue"} 
		self.grilla[int(tupla[0])][int(tupla[1])]["bg"] = dic[valor]

	def hiLevelCallback(self):
		self.root.after(333, self.hiLevelCallback)
		self.update()
		sleep(0.2)

		def callback(event):
			self.frameEnemigo.focus_set()
			texto = event.widget.__getitem__("text")
			tupla = (texto[0], texto[2])
			self.cliente.Atacar(tupla)	
			print tupla
	
		def nocallback(event):
			self.frameEnemigo.focus_set()
			pass
					
		if self.cliente.turno:# and not self.cliente.verAtaque:
			if not self.botones:
				self.root.title("TU TURNO!")
				self.botones = True
				for i in range(TAMANIO):
					for j in range(TAMANIO):
						self.grillaEnemiga[i][j].bind("<Button-1>", callback)
			self.update()
			if self.cliente.listo:
				self.cliente.listo = False
				self.actualizarEnemigo(self.cliente.ultimaTupla, self.cliente.ultimoValor)
				self.cliente.turno = False
				self.cliente.ultimaTupla = None
				self.cliente.ultimoValor = None
				self.cliente.esperarRespuesta = False
		else:
			if self.botones:
				self.root.title("Esperando...")
				self.botones = False
				for i in range(TAMANIO):
					for j in range(TAMANIO):
						self.grillaEnemiga[i][j].unbind("<Button-1>")
						self.grillaEnemiga[i][j].bind("<Button-1>", nocallback)
			self.update()
			if self.cliente.verAtaque:
				self.cliente.verAtaque = False
				self.actualizarMio(self.cliente.tupla, self.cliente.valor)
				self.cliente.tupla = None
				self.cliente.valor = None	
				self.cliente.turno = True

	def Jugar(self):
		sleep(0.1)
		self.botones = not self.cliente.turno
		self.root = Tk(); 
		self.root.title("Tableros")
		self.frame = Frame(self.root, bg = "black", width = 500, height = 500)
		self.frame.pack()
		self.grillaEnemiga = []
		self.frameEnemigo = Frame(self.root, bg = "black", width = 500, height = 500)
		self.frameEnemigo.pack(side=LEFT, expand = 1)
		self.frameEnemigo.focus_set()

		self.grilla = []

		for i in range(TAMANIO):
			self.grilla.append([])
			for j in range(TAMANIO):
				cad = str(i)+"-"+str(j)
				b = Button(self.frame, text = cad, bg="blue")
				b.grid(row=i, column=j)
				self.grilla[i].append(b)

		for barco in getattr(self.tablero, self.lista):
			for pos in barco.listar_posiciones():
				x, y = getattr(pos, self.x), getattr(pos, self.y)
				self.grilla[x][y]["bg"] = "green"

		for i in range(TAMANIO):
			self.grillaEnemiga.append([])
			for j in range(TAMANIO):
				cad = str(i)+"-"+str(j)
				b = Button(self.frameEnemigo, text = cad, bg="black")
				b.grid(row=i, column=j)
				self.grillaEnemiga[i].append(b)
	
		self.root.after(100, self.hiLevelCallback)
		self.root.mainloop()
			

